#!/usr/bin/env python
# -*- coding:utf-8 -*- 
# Author: Jeokayne Ataier

#linux命令执行服务端

import subprocess
import socket

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR) 重复利用端口和IP的代码 --避免重启程序时的IP或端口占用冲突
server.bind(("127.0.0.1",8881))

server.listen(10)

while True:
    conn,addr = server.accept()

    while True:
        try: #win处理空接收值的问题
            cmd = conn.recv(1024)
            print("客户端传来需执行的命令：",cmd)
            #Linux处理空接收值的问题
            if not cmd:
                break
            output_obj=subprocess.Popen(cmd.decode("utf-8"),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
            stdout = output_obj.stdout.read() #执行命令未报错时，获得返回值（byte形式，传输无需encode） --os.system()执行后，返回0
            stderr = output_obj.stderr.read() #执行命令报错时，获得返回值（byte形式，传输无需encode） --os.system()执行后，返回非0

            '''
            客户端已经写好自动获取编码格式的代码，如果自己手动写decode，注意下面的编码：
            1.windows系统返回的byte需要用gbk解码decode
            2.Linux系统返回的byte需要用utf-8解码decode
            3.执行正确后，stderr返回值为空，反之亦然 --可优化
            '''
            if len(stdout+stderr) == 0:
                conn.send("返回值为空".encode("utf-8"))
                print("返回值为空")
            else:
                conn.send(stdout+stderr)
                print("命令执行返回值为：",stdout+stderr)
        except ConnectionResetError:
            break

    conn.close()